package swingset;
/*
 *
 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.SoftBevelBorder;
import java.awt.BorderLayout;
import java.awt.Dimension;

/**
 * A generic SwingSet2 demo module
 *
 * @author Jeff Dinkins
 */
public class DemoModule extends JFrame
{

	// The preferred size of the demo
	private final int PREFERRED_WIDTH = 680;
	private final int PREFERRED_HEIGHT = 600;

	Border loweredBorder = new CompoundBorder(new SoftBevelBorder(SoftBevelBorder.LOWERED),
			new EmptyBorder(5, 5, 5, 5));

	// Premade convenience dimensions, for use wherever you need 'em.
	public static Dimension HGAP2 = new Dimension(2, 1);
	public static Dimension VGAP2 = new Dimension(1, 2);

	public static Dimension HGAP5 = new Dimension(5, 1);
	public static Dimension VGAP5 = new Dimension(1, 5);

	public static Dimension HGAP10 = new Dimension(10, 1);
	public static Dimension VGAP10 = new Dimension(1, 10);

	public static Dimension HGAP15 = new Dimension(15, 1);
	public static Dimension VGAP15 = new Dimension(1, 15);

	public static Dimension HGAP20 = new Dimension(20, 1);
	public static Dimension VGAP20 = new Dimension(1, 20);

	public static Dimension HGAP25 = new Dimension(25, 1);
	public static Dimension VGAP25 = new Dimension(1, 25);

	public static Dimension HGAP30 = new Dimension(30, 1);
	public static Dimension VGAP30 = new Dimension(1, 30);

	private final SwingSet2 swingset;
	private final JPanel panel;
	private final String resourceName;
	private final String iconPath;
	//	private String sourceCode = null;

	public DemoModule(SwingSet2 swingset)
	{
		this(swingset, null, null);
	}

	public DemoModule(SwingSet2 swingset, String resourceName, String iconPath)
	{
		UIManager.put("swing.boldMetal", Boolean.FALSE);
		panel = new JPanel();
		panel.setLayout(new BorderLayout());

		this.resourceName = resourceName;
		this.iconPath = iconPath;
		this.swingset = swingset;

		//		loadSourceCode();
	}

	public String getResourceName()
	{
		return resourceName;
	}

	public JPanel getDemoPanel()
	{
		return panel;
	}

	public SwingSet2 getSwingSet2()
	{
		return swingset;
	}

	public String getString(String key)
	{

		if (getSwingSet2() != null)
		{
			return getSwingSet2().getString(key);
		} else
		{
			return "nada";
		}
	}

	public char getMnemonic(String key)
	{
		return (getString(key)).charAt(0);
	}

	public ImageIcon createImageIcon(String filename, String description)
	{
		if (getSwingSet2() != null)
		{
			return getSwingSet2().createImageIcon(filename, description);
		} else
		{
			String path = "/resources/images/" + filename;
			return new ImageIcon(getClass().getResource(path), description);
		}
	}

	//	public String getSourceCode()
	//	{
	//		return sourceCode;
	//	}

	//	public void loadSourceCode()
	//	{
	//		if (getResourceName() != null)
	//		{
	//			String filename = getResourceName() + ".java";
	//			sourceCode = "<html><body bgcolor=\"#ffffff\"><pre>";
	//			InputStream is;
	//			InputStreamReader isr;
	//			CodeViewer cv = new CodeViewer();
	//			URL url;
	//
	//			try
	//			{
	//				url = getClass().getResource(filename);
	//				is = url.openStream();
	//				isr = new InputStreamReader(is, StandardCharsets.UTF_8);
	//				BufferedReader reader = new BufferedReader(isr);
	//
	//				// Read one line at a time, htmlize using super-spiffy
	//				// html java code formating utility from www.CoolServlets.com
	//				String line = reader.readLine();
	//				while (line != null)
	//				{
	//					sourceCode += cv.syntaxHighlight(line) + " \n ";
	//					line = reader.readLine();
	//				}
	//				sourceCode += "</pre></body></html>";
	//			} catch (Exception ex)
	//			{
	//				sourceCode = "Could not load file: " + filename;
	//			}
	//		}
	//	}

	public String getName()
	{
		return getString(getResourceName() + ".name");
	}

	public Icon getIcon()
	{
		return createImageIcon(iconPath, getResourceName() + ".name");
	}

	public String getToolTip()
	{
		return getString(getResourceName() + ".tooltip");
	}

	public void mainImpl()
	{
		JFrame frame = new JFrame(getName());
		frame.getContentPane().setLayout(new BorderLayout());
		frame.getContentPane().add(getDemoPanel(), BorderLayout.CENTER);
		getDemoPanel().setPreferredSize(new Dimension(PREFERRED_WIDTH, PREFERRED_HEIGHT));
		frame.pack();
		frame.setVisible(true);
	}

	public JPanel createHorizontalPanel(boolean threeD)
	{
		JPanel p = new JPanel();
		p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
		p.setAlignmentY(TOP_ALIGNMENT);
		p.setAlignmentX(LEFT_ALIGNMENT);
		if (threeD)
		{
			p.setBorder(loweredBorder);
		}
		return p;
	}

	public JPanel createVerticalPanel(boolean threeD)
	{
		JPanel p = new JPanel();
		p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
		p.setAlignmentY(TOP_ALIGNMENT);
		p.setAlignmentX(LEFT_ALIGNMENT);
		if (threeD)
		{
			p.setBorder(loweredBorder);
		}
		return p;
	}

	public static void main(String[] args)
	{
		DemoModule demo = new DemoModule(null);
		demo.mainImpl();
	}

	//	public void init()
	//	{
	//		getContentPane().setLayout(new BorderLayout());
	//		getContentPane().add(getDemoPanel(), BorderLayout.CENTER);
	//	}

	void updateDragEnabled(boolean dragEnabled)
	{
	}
}
